home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------
-
- aevt.c
-
- This module handles Apple events.
-
- Copyright © 1994-1995, Northwestern University.
-
- ----------------------------------------------------------------------------*/
-
- #include <stdio.h>
-
- #include "glob.h"
- #include "aevt.h"
- #include "dialog.h"
- #include "newsrc.h"
- #include "memutil.h"
- #include "message.h"
- #include "group.h"
- #include "newswatcher.h"
- #include "status.h"
- #include "full.h"
- #include "subscribe.h"
- #include "print.h"
- #include "windutil.h"
- #include "wind.h"
- #include "url.h"
-
-
-
- #define kInitialGroupsResId 200 /* STR# resource id of intial group list
- customization resource */
-
- #define kOpenPrefsFileDlg 156
- #define kOpenPrefsFileDlgQuitItem 1
-
-
-
- static AppleEvent *gFirstEvent;
- static AppleEvent *gFirstReply;
-
- static AEEventHandlerUPP gHandleOAPPUPP;
- static AEEventHandlerUPP gHandleODOCUPP;
- static AEEventHandlerUPP gHandlePDOCUPP;
- static AEEventHandlerUPP gHandleQUITUPP;
- static AEEventHandlerUPP gHandleGURLUPP;
- static AEEventHandlerUPP gHandleFirstEventUPP;
-
-
-
- /*----------------------------------------------------------------------------
- MyGotRequiredParams
-
- Check for unexpected required parameters. See NIM:IAC 4-35.
-
- Entry: event = pointer to event.
-
- Exit: function result = error code (errAEParamMissed if unexpected
- required parameter).
- ----------------------------------------------------------------------------*/
-
- static OSErr MyGotRequiredParams (AppleEvent *event)
- {
- OSErr err = noErr;
- DescType returnedType;
- Size actualSize;
-
- err = AEGetAttributePtr(event, keyMissedKeywordAttr, typeWildCard,
- &returnedType, nil, 0, &actualSize);
- return err == errAEDescNotFound ? noErr : errAEParamMissed;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandleOAPP
-
- Handle the open application event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandleOAPP (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- WindowPtr wind;
- OSErr err = noErr;
- Boolean addingInitialSubscribedGroupsStatusMesageDisplayed = false;
- short i;
- Str255 groupName;
- long groupIndex;
- long nameOffset;
-
- err = MyGotRequiredParams(event);
- if (err != noErr) goto exit;
- if (gStartingUp) {
- if (gPrefs.autoFetchNewsrc) return noErr;
- err = MakeNewUntitledUserGroupWindow(&wind);
- if (err != noErr) goto exit;
- SendBehind(wind, nil);
- if (!gPrefsFileFoundAtStartup) {
- i = 1;
- while (true) {
- *groupName = 0;
- GetIndString(groupName, kInitialGroupsResId, i);
- if (*groupName == 0) break;
- if (!addingInitialSubscribedGroupsStatusMesageDisplayed) {
- err = DisplayStatusMessageNumber(kStrAddingInitialSubscribedGroups);
- if (err != noErr) goto exit;
- addingInitialSubscribedGroupsStatusMesageDisplayed = true;
- }
- p2cstr(groupName);
- groupIndex = FindGroupIndex((char*)groupName);
- if (groupIndex != -1) {
- nameOffset = (*gFullGroupArray)[groupIndex].nameOffset;
- err = AddNewGroup(nameOffset, wind, 0x7fff, nil, false);
- if (err != noErr) goto exit;
- }
- i++;
- }
- err = DoZoom(wind, inZoomOut);
- if (err != noErr) goto exit;
- }
- return noErr;
- } else {
- if (!gStartupOK) return userCanceledErr;
- return MakeNewUntitledUserGroupWindow(&wind);
- }
-
- exit:
-
- ReportSystemError(err);
- return err;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandleODOC
-
- Handle the open document event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandleODOC (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- OSErr err = noErr;
- AEDescList docList = {0, nil};
- long numItems, i;
- AEKeyword keywd;
- DescType returnedType;
- Size actualSize;
- FSSpec fSpec;
- FInfo fndrInfo;
- DialogPtr dlg;
- short item;
- WindowPtr wind;
-
- if (!gStartupOK) return userCanceledErr;
- err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
- if (err != noErr) goto exit;
- err = MyGotRequiredParams(event);
- if (err != noErr) goto exit;
- err = AECountItems(&docList, &numItems);
- if (err != noErr) goto exit;
- for (i = 1; i <= numItems; i++) {
- err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
- (Ptr)&fSpec, sizeof(fSpec), &actualSize);
- if (err != noErr) goto exit;
- err = FSpGetFInfo(&fSpec, &fndrInfo);
- if (err != noErr) goto exit;
- if (fndrInfo.fdType == kPrefsFileType && !gStartingUp) goto exit1;
- if (fndrInfo.fdType == kSavedUserGroupListFileType) {
- err = OpenUserGroupListFile(&fSpec);
- } else if (fndrInfo.fdType == kSavedMessageFileType) {
- err = OpenMessageFile(&fSpec, &wind);
- }
- if (err != noErr) goto exit;
- }
- err = AEDisposeDesc(&docList);
- if (err != noErr) goto exit;
- return noErr;
-
- exit:
-
- if (docList.dataHandle != nil) AEDisposeDesc(&docList);
- ReportSystemError(err);
- return err;
-
- exit1:
-
- if (docList.dataHandle != nil) AEDisposeDesc(&docList);
- err = MyGetNewDialog(kOpenPrefsFileDlg, kOpenPrefsFileDlgQuitItem, cancel, &dlg);
- if (err != noErr) return err;
- SysBeep(0);
- MyModalDialog(dlg, gDialogFilterUPP, &item);
- err = DoClose(dlg);
- if (err != noErr) return err;
- if (item == kOpenPrefsFileDlgQuitItem) gDone = true;
- return userCanceledErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandlePDOC
-
- Handle the print document event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandlePDOC (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- OSErr err = noErr;
- AEDescList docList = {0, nil};
- long numItems, i;
- AEKeyword keywd;
- DescType returnedType;
- Size actualSize;
- FSSpec fSpec;
- FInfo fndrInfo;
- WindowPtr wind;
- TWindow **info;
- TEHandle theTE;
- Handle text;
- CStr255 title;
- long start, end;
- Boolean firstFile = true;
-
- if (!gStartupOK) return userCanceledErr;
- wind = MyFrontWindow();
- if (GetMyWindowKind(wind) == kStatus) DoClose(wind);
- err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
- if (err != noErr) goto exit;
- err = MyGotRequiredParams(event);
- if (err != noErr) goto exit;
- err = AECountItems(&docList, &numItems);
- if (err != noErr) goto exit;
- for (i = 1; i <= numItems; i++) {
- err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
- (Ptr)&fSpec, sizeof(fSpec), &actualSize);
- if (err != noErr) goto exit;
- err = FSpGetFInfo(&fSpec, &fndrInfo);
- if (err != noErr) goto exit;
- if (fndrInfo.fdType == kSavedMessageFileType) {
- err = OpenMessageFile(&fSpec, &wind);
- if (err != noErr) goto exit;
- HandleUpdate(wind);
- if (firstFile) {
- err = StartPrint();
- if (err != noErr) goto exit;
- err = DisplayStatusMessageNumber(kStrPrinting);
- if (err != noErr) goto exit;
- firstFile = false;
- }
- GetWTitle(wind, (StringPtr)title);
- p2cstr((StringPtr)title);
- info = (TWindow**)GetWRefCon(wind);
- theTE = (**info).theTE;
- text = (**theTE).hText;
- start = 0;
- end = MyGetHandleSize(text);
- err = PrintText(text, start, end, title);
- if (err != noErr) goto exit;
- err = DoClose(wind);
- if (err != noErr) goto exit;
- }
- }
- err = AEDisposeDesc(&docList);
- if (err != noErr) goto exit;
- return noErr;
-
- exit:
-
- if (docList.dataHandle != nil) AEDisposeDesc(&docList);
- ReportSystemError(err);
- return err;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandleQUIT
-
- Handle the quit application event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandleQUIT (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- OSErr err = noErr;
-
- err = MyGotRequiredParams(event);
- if (err != noErr) return err;
- gDone = true;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandleGURL
-
- Handle the get url event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandleGURL (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- CStr255 url;
- DescType typeCode;
- Size actualSize;
- OSErr err = noErr;
- OSErr result = noErr;
-
- if (!gStartupOK) return userCanceledErr;
- err = AEGetParamPtr(event, keyDirectObject, typeChar, &typeCode, url,
- 255, &actualSize);
- if (err != noErr) return err;
- err = MyGotRequiredParams(event);
- if (err != noErr) return err;
- url[actualSize] = 0;
- result = OpenURLString(url);
- if (reply->dataHandle != nil) {
- err = AEPutParamPtr(reply, keyDirectObject, typeShortInteger,
- &result, sizeof(result));
- if (err != noErr) return err;
- } else {
- switch (result) {
- case paramErr:
- ErrorMessageNumber(kStrURLSyntaxError);
- break;
- case fnfErr:
- NoteMessageNumber(kStrArticleOrGroupNotFound);
- break;
- default:
- ReportSystemError(result);
- break;
- }
- }
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- HandleFirstEvent
-
- Handle the first event.
- ----------------------------------------------------------------------------*/
-
- static pascal OSErr HandleFirstEvent (AppleEvent *event, AppleEvent *reply, long refcon)
- {
- *gFirstEvent = *event;
- *gFirstReply = *reply;
- return AESuspendTheCurrentEvent(event);
- }
-
-
-
- /*----------------------------------------------------------------------------
- InitializeAppleEvents
-
- Initialize Apple events. Get the first event and suspend it. The caller
- must resume this first event to actually process it when initialization
- is complete.
-
- Exit: funtion result = error code.
- firstEvent = event record for first event.
- firstReply = reply record for first event.
- ----------------------------------------------------------------------------*/
-
- OSErr InitializeAppleEvents (AppleEvent *firstEvent, AppleEvent *firstReply)
- {
- OSErr err = noErr;
- Boolean gotEvt;
- EventRecord ev;
-
- gFirstEvent = firstEvent;
- gFirstReply = firstReply;
-
- gHandleOAPPUPP = NewAEEventHandlerProc(HandleOAPP);
- gHandleODOCUPP = NewAEEventHandlerProc(HandleODOC);
- gHandlePDOCUPP = NewAEEventHandlerProc(HandlePDOC);
- gHandleQUITUPP = NewAEEventHandlerProc(HandleQUIT);
- gHandleGURLUPP = NewAEEventHandlerProc(HandleGURL);
- gHandleFirstEventUPP = NewAEEventHandlerProc(HandleFirstEvent);
-
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
- gHandleFirstEventUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
- gHandleFirstEventUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
- gHandleFirstEventUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
- gHandleFirstEventUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
- gHandleFirstEventUPP, 0, false);
- if (err != noErr) return err;
-
- while (true) {
- gotEvt = WaitNextEvent(highLevelEventMask | activMask | updateMask | osMask,
- &ev, GetCaretTime(), nil);
- if (gotEvt && ev.what == kHighLevelEvent) {
- err = AEProcessAppleEvent(&ev);
- if (err != noErr) return err;
- break;
- }
- if (gotEvt) HandleEvent(&ev);
- }
-
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
- gHandleOAPPUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
- gHandleODOCUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
- gHandlePDOCUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
- gHandleQUITUPP, 0, false);
- if (err != noErr) return err;
- err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
- gHandleGURLUPP, 0, false);
- return err;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyAEProcessAppleEvent
-
- Process an Apple event.
-
- Entry: ev = pointer to event record.
-
- Exit: funtion result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr MyAEProcessAppleEvent (EventRecord *ev)
- {
- OSErr err = noErr;
-
- gAEServer = true;
- err = AEProcessAppleEvent(ev);
- gAEServer = false;
- return err;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyAEResumeTheCurrentEvent
-
- Resume processing an Apple event.
-
- Entry: event = pointer to event record.
- reply = pointer to reply record.
- dispatcher = pointer to event handler.
- handlerRefcon = refcon.
-
- Exit: funtion result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr MyAEResumeTheCurrentEvent (AppleEvent *event, AppleEvent *reply,
- AEEventHandlerUPP dispatcher, long handlerRefCon)
- {
- OSErr err = noErr;
-
- gAEServer = true;
- err = AEResumeTheCurrentEvent(event, reply, dispatcher, handlerRefCon);
- gAEServer = false;
- return err;
- }
-